#include "mypthread.hpp"

// void fun()
// {
//     int cnt = 5;
//     while(cnt--)
//     {
//         std::cout << "新线程执行函数" << std::endl;
//         sleep(1);
//     }
// }

// ThreadSpace::func_t fun1 = [](){
//     int cnt = 3;
//     while(cnt--)
//     {
//         sleep(1);
//         std::cout << "这是一个日志任务!" << std::endl;
//     }
// };

// ThreadSpace::func_t fun2 = [](){
//     int cnt = 3;
//     while(cnt--)
//     {
//         sleep(1);
//         std::cout << "这是一个下载任务!" << std::endl;
//     }
// };

// ThreadSpace::func_t fun3 = [](){
//     int cnt = 3;
//     while(cnt--)
//     {
//         sleep(1);
//         std::cout << "这是一个上传任务!" << std::endl;
//     }
// };

// ThreadSpace::func_t fun4 = [](){
//     int cnt = 3;
//     while(cnt--)
//     {
//         sleep(1);
//         std::cout << "这是一个压缩任务!" << std::endl;
//     }
// };

// ThreadSpace::func_t fun5 = [](){
//     int cnt = 3;
//     while(cnt--)
//     {
//         sleep(1);
//         std::cout << "这是一个打印任务!" << std::endl;
//     }
// };


class threadData 
{
public:
    threadData()
    :_max(10)
    ,_start(0)
    {}
    
    int _max;
    int _start;
};
 
void Count(threadData td){
    for(int i = td._start; i < td._max; i++){
        std::cout << "i == " << i << std::endl;
        sleep(1);
    }
}


int main()
{
    // ThreadSpace::Thread t(fun1); /* 创建一个线程对象 */
    // sleep(1);
    // std::cout << "我要开始创建线程了" << std::endl;
    // sleep(1);
    // t.Start(); /* 启动线程, 创建线程*/

    // // sleep(1);
    // // std::cout << "我要开始分离线程了" << std::endl;
    // // t.Detach(); /* 线程分离 */

    // sleep(1);
    // std::cout << "我要开始取消线程了" << std::endl;
    // t.Cancel(); /* 取消一个线程 */

    // sleep(8);
    // std::cout << "我要开始回收线程了" << std::endl;
    // sleep(1);
    // t.Join(); /* 线程回收 */
    // // std::cout << (long long)t.GetRet() << std::endl;

    /* 多线程测试 */
    // std::vector<ThreadSpace::Thread> threads;
    // for(int i = 1; i <= 5; ++i)
    // {
    //     ThreadSpace::Thread t(fun1);
    //     threads.emplace_back(t);
    // }

    // std::cout << "启动线程" << std::endl;
    // for(auto& thread:threads)
    // {
    //     thread.Start();
    // }

    // sleep(1);
    // std::cout << "回收线程" << std::endl;
    // for(auto& thread:threads)
    // {
    //     thread.Join();
    // }

    /* 调用的函数需要传递对象类型 */
    threadData td;
    ThreadSpace_T::Thread<threadData> t(Count, td);
    t.Start();
    t.Join();

    return 0;
}